#include<iostream>

using namespace std;

const int maxn = 100010;

int n, m;

//所有的数都存在这个 p 数组里面 ，比如 x 访问 x 就相当于访问 数组中下标为 x 的那个点，然后这个点存的值是 x 的父节点
//只有父节点才是下标值等于数组对应值的
int p[maxn];   //初始的时候每个数都是一个集合，这个 p 集合就是存放每个集合的树根

//返回x的祖宗节点  ->加上了路径压缩
int find(int x) {
    if (p[x] != x) {
        p[x] = find(p[x]);
    }

    return p[x];
}

int main() {

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        p[i] = i;  //把p[]每个元素都设置成父节点
    }

    while (m--) {
        char op[2];
        int a, b;
        scanf("%s%d%d", op, &a, &b);

        if (op[0] == 'M') {
            p[find(a)] = find(b);
        } else {
            if (find(a) == find(b)) {
                puts("Yes");
            } else {
                puts("No");
            }
        }

    }
    return 0;
}